Date		:	4 octobre 1992
		Programme	:	MEMOTEL
		Protection	:       CLEF PHYSIQUE
		Outils		:	SOFT-ICE V2.50 - SOURCER V4.05
		Temps pass�	:	4 heures d�j�
		Fichier		:       MEMOTEL.EXE
		Soci�t�		:	GOTO Informatique
		Divers		:	Unachieved cracking !
		Origine		:	B.Alain
		Num�ro		:	188


	D�mentiel !
	Je n'ai jamais vu un programme prot�g� de cette fa�on l�:

	1) SUPERLOCK n'autorisant qu'une seule installation.
	2) CLEF PHYSIQUE.
	3) COMPACTAGE DU FICHIER par une routine maison.
	4) ROUTINES ANTI DEBUGGAGE.

	Je n'ai pour l'instant seulement r�ussi � modifier les routines
	emp�chant le pas � pas par un d�buggeur.
	C'est tellement rus� que je vais utiliser l'astuce dans mes futurs
	lan�eurs.
	Le principe ? Tout le fichier est crypt� sauf une petite routine qui
	se chargera de d�crypter le fichier en RAM. Ca c'est classique, je fais
	la m�me chose avec mes lan�eurs. Ce qui est un plus c'est que le
	programme utilise les INT 00, 01 et 02 pour d�compacter le fichier.
	Smart wunderschoen ! 
	Comme chacun le sait ces interruptions font parti des IT hard. Ce qui
	ne veut pas dire qu'on ne peut pas les utiliser par soft. Mais dans ce
	cas il faut prendre un maximum de pr�caution et ne pas oublier que si
	en temps normal l'INT 01 et 02 ne surviennent jamais toutes seules il
	n'en ai pas de m�me de l'INT 00. Je m'explique:

	INT 00	--> Division par z�ro.
	INT 01	--> Interruption utilis� par tout d�buggeur pour r�aliser la
		    fonction pas � pas d'un programme. Et dans un 80386 c'est
		    le flag DEBUG EXEPTION. Est-ce que vous commencez � 
		    entrevoir le probl�me ?
	INT 02  --> NMI

	Et en pratique cel� se traduit tout simplement par un plantage de
	MEMOTEL et de SOFT-ICE lorsque l'on lance MEMOTEL sous SOFT-ICE.
	Dans ce cas il faut lancer le programme avec LDR. On arrive presque
	imm�diatement � l'INT 01. Et l� avec un peu de chance on peut l'�x�cuter
	deux ou trois fois avant que tout ne se plante. Je ne m'explique
	d'ailleurs pas comment cel� peut marcher, mais en tout cas cel� m'a
	permis de voir ce que faisait faire le soft � l'INT 01:

	PUSH AX
	PUSH BX
	XOR BYTE PTR [SI],7F
	POP BX
	POP AX
	IRET

	En fait les PUSH-POP ne servent � rien puisque l'on n'alt�re aucun de
	ces registres. Il reste le ou exclusif du contenu de [SI] avec 7F.
	( 3 octets ). Cette instruction fait partie de la routine qui d�XORe
	le fichier pour le mettre en clair. Le fait d'avoir plac� cette
	instruction dans l'INT 01 est assez g�nial. Une autre instruction de
	division DIV CL fait aussi partie de la routine. Et bien entendu l'INT
	00 a �galement �t� manipul�e. Voir ci-dessous la routine compl�te:

	CS:0AF9	CD01	INT 	01
	CS:0AFA	46	INC	SI
	CS:0AFC 03F8	ADD	DI,AX
	CS:0AFE	2BCE	SUB	CX,SI
	CS:0B00	F6F1	DIV	CL
	CS:0B02	3D0000	CMP	AX,0000
	CS:0B05	75E8	JNZ	0AEF
	CS:0B07	BFAC00	MOV	DI,00AC
	CS:0B0A	BE7B00  MOV 	SI,007B
	CS:0B0D	EBB5	JMP	0AC4
	CS:0B0F	90	NOP
	CS:0B10	90	NOP

	En modifiant l'INT 01 par l'INT 99 et en faisant pointer cette IT
	en 9000:0000 ( pr�s de la fin de la m�moire, je suis sur que l� il n'y
	a rien ) puis en placant en 9000:0000 un XOR [SI],7F j'arrive � faire
	tourner MEMOTEL sous SOFT-ICE. Il faut maintenant trouver une astuce
	pour faire la modif dans le fichier. Plusieurs solutions existent mais
	toutes sauf une n�cessitent un nombre impressionant d'octets qu'il est
	impossible de trouver dans une zone texte comme je le fais souvent vu
	que la seule partie en clair dans ce ?%&*#! de soft c'est justement
	cette routine de d�cryptage.
	Pour examiner la routine de mise en place des nouveaux vecteurs d'IT,
	qui n'utilise �videment pas l'INT 21 sf 25 et 35 du DOS ( ils ne sont
	pas tomb�s sur la t�te ! ) je place un point d'arr�t en zone IT, chose
	que faisait parfaitement ma carte PANO avec le point d'arr�t suivant:
	BPMW 0:0 0:4 R
	Heureusement SOFT-ICE fonctionne jusque l�. On s'aper�oit que ES:DI
	contiennent 0000 et CX contient 0004. On va transf�rer 4 mots et
	incr�menter DI. Ces mots seront les nouveaux vecteurs d'IT des INT 0,
	1 et 2. L'id�e est de d'utiliser les IT du BASIC r�sident ( qui n'existe
	plus ) � partir de l'INT 99. Quelques NOP existent pas trop loin, je
	les utilisent pour placer 99*4 dans DI. --> MOV DI,99*4.
	Une petite parenth�se: lorsque des NOP existent dans un programme
	en nombre aussi impressionant qu'ici, on peut supposer sans beaucoup
	se tromper que d'une part le logiciel a �t� �crit en ASM et qu'il a
	fait l'objet d'op�ration pas catholique. J'entends par l� qu'il a 
	bien fallu lors de la mise au point utiliser un d�buggeur et ces
	NOP repr�sentent l'endroit o� se trouvaient des instructions capable
	de faire tourner le soft avec ledit d�buggeur.
	Il existe des  NOP dans d'autre programme �crit en langage �volu� et
	que le compilateur et/ou le linker a laisser l�. Mais dans ce cas se
	sont souvent des alignements de paragraphes.
	Je fais le patch et je relance le soft directement et ce dernier ne
	se plante plus mais affiche DIVISION par ZERO. ( en fait ce n'est pas
	lui qui affiche cette phrase mais la routine point�e par l'INT 00
	dans le BIOS ) 
	Et l� il m'a fallu une s�ance de BRAINSTORMING pour comprendre ce
	qui s'�tait pass�.
	Mon patch fonctionne correctement, les vecteurs qui �taient utilis�s
	pour les INT 0,1 et 2 sont bien r�ecrit en INT 99, 9A et 9B. Et ces
	vecteurs pointent vers les bonnes instructions qui se terminent
	correctement par un IRET. Alors quoi ?
	Alors voil�: la routine de d�cryptage comprend une instruction de
	division et ( c'est voulu ) � un moment on divise effectivement CL
	par zero. Mais ce n'est pas le SOFT qui appelle cette IT, mais le
	hard ! Et le hard ne peut pas �tre patch� ( heureusement ). Lors de
	la division par zero le 80X86 emet une IT de priorit� zero et consulte
	la table des vecteurs � l'adresse 0000:0000 ( INT 0 ). Et l� il va
	trouver les vecteurs d'origine qui pointent dans le BIOS et qui font
	afficher le message "DIVISION par ZERO". La routine de d�cryptage
	utilisait cette INT modifi�e pour son besoin de d�cryptage interne.
	
	La seule solution consiste � ne patcher que l'INT 01 et laisser l'INT
	0 et 2 en place. Ce n'est pas g�nant pour SOFT-ICE puisqu'il ne s'en
	sert pas. Le cas d'un d�buggage par une carte hard est bien compromis
	�galement puisqu'une telle carte utilise la NMI.
	
	En examinant la routine on s'aper�oit que 2 NOP se trouvent apr�s la
	routine. Et en supprimant l'appel de l'INT 01 cel� fait encore 2 octets
	de gagn�. En tout 4 octets qui peuvent �tre lib�r�s. En pla�ant � la
	place de INT 01 l'instruction qui se trouve dans l'INT 01 c.a.d.
	XOR byte [SI],7F et en d�calant le reste du code d'un octet cel�
	fonctionne !
	
 	CS:0AF9 80347F  XOR BYTE PTR [SI],7F	*	modifi�
	CS:0AFC	46	INC	SI		.	d�cal�
	CS:0AFD 03F8	ADD	DI,AX		.	   "
	CS:0AFF	2BCE	SUB	CX,SI		.	   "	
	CS:0B01	F6F1	DIV	CL		.	   "
	CS:0B03	3D0000	CMP	AX,0000		.	   "	
	CS:0B06	75E7	JNZ	0AEF		*	modifi�
	CS:0B08	BFAC00	MOV	DI,00AC		.	d�cal�
	CS:0B0B	BE7B00  MOV 	SI,007B		.	d�cal�
	CS:0B0E	EBB4	JMP	0AC4		*	modifi�
	CS:0B10	90	NOP

	Il a fallu bien entendu modifier les deux sauts qui suivent: Offset-1.
	Maintenant MEMOTEL tourne sous SOFT-ICE et s'arr�te bien lorsque
	je place un BP sur le port de l'imprimante.
	Deux tests sont fait apr�s la clef en 1776:060C et CS:0635; on CMP AX
	� 5434h. En for�ant ces deux tests le soft ne cherche plus la clef, il
	affiche: " Utilisation ill�gale " .
	Ca alors !
	En d�roulant le programme on trouve 3 CALLs :
	
	CS=1776
	CS:030B	E86502	CALL	0573
	CS:030E	E80600	CALL	0327
	CS:0311 E8....  CALL    ....
	CS:0314 EB..    JMP     ....

	Le premier demande la CLEF, le suivant sort vers le DOS dans le cas
	d'absence de la clef.
	Et le troisi�me me reste encore inconnu. En sautant les trois on 
	rencontre une autre routine avec l'INT 01. J'ai stopp� l� pour
	l'instant.
	
	A suivre...